# #模型类的两种调用方式
        # #绝对路径方式引用statsmodels.regression.linear_model.OLS()类
        # import statsmodels
# from statsmodels.regression.linear_model import OLS
# OLS([1,2,3], [4,5,6])
        # print(OLS)
        # #使用API方式引用statsmodels.regression.linear_model.OLS()类
        # import statsmodels.api as sm
        # sm.OLS([1,2,3], [4,5,6])
        # olsobj = sm.OLS([1,2,3], [4,5,6])
        # print(type(olsobj))
        # print(olsobj)
        #
        # #模型类的各种属性 olsobj.  例如
        # olsobj.data
        #
        # #模型拟合后的结果类
        # result = olsobj.fit()
        # type(result)
        # result.params #取出所需的结果
        # print(result.summary()) #输出模型报告，还有各种输出能调用
import pandas as pd
        #可以使用表达式形式的模型类列表
import statsmodels.formula.api as smf
from dask.array import shape
from sklearn.datasets import load_iris, load_diabetes, load_digits, load_linnerud
dir(smf)#返回smf中所有类、函数、变量的列表
        #模型的同名小写名称（formula、data、subset=None、**kwargs、*args）
        #格式： smf.ols('模型表达式',dfname)  ols是其中的一个接口


        # from sklearn import datasets
# boston=datasets.load_boston() #boston房屋价格数据集 回归  506*13
        # print(boston.data)  #数据集已删除
        # bostondf=pd.DataFrame(boston.data,columns=boston.feature_names)
        # print(bostondf.head()) #转化为数据框便于使用
        # load_iris(return_X_y=True) #鸢尾花数据集  分类  150*4
        # load_diabetes() #糖尿病数据集  回归 442*10
        # load_digits([n_class]) #手写字数据集 分类 1797*64
        # load_linnerud() #运动和生理指标数据集 多元分析  20


        # class sklearn.大类名称.Modelclass(类参数列表)(
        #     fit_intercept=True :模型是否包含常数项，使用该选项就不需要在数据框中设定cons(常数)
        #     n_jobs= 1:使用的例程数，为-1时使用全部CPU
        #     max_iter=1000: int 最大迭代次数
        #     tol=1e-4: float 迭代终止条件，小于该值则终止迭代 1e-4=0.0001,模型收敛标准
        #     warm_start=False: bool 是否使用上次的模型拟合结果作为初始值，默认为False
        #     sample_weight=None :案例权重
        #     random_state=None : int/RandomState  instance/None 随机种子，用于随机数生成，默认为None
        #     shuffle=True: bool 是否打乱数据，默认为True
        # )大多数类参数都会有默认值


        # from sklearn import preprocessing
        # #完整的类名称为 sklearn.preprocessing.StandardScaler()
        # scaler = preprocessing.StandardScaler()
        # print(scaler)
        # from sklearn import linear_model
        # # 完整的类名称为 sklearn.linear_model.LinearRegression()
        # clf = linear_model.LinearRegression()
        # print(clf)
        #
        # Modelclass中基本通用的类方法：
        # get_params([deep=True]):获取模型的具体参数设定
        # set_params(**params):设置模型的参数
        # fit(X, y, sample_weight=None):模型拟合，返回模型对象本身，使用数据拟合模型、方法
        # 特征处理class:Preprocessing、降维、Feature extraction/selection
        #     transform(X[,y]):使用拟合好的模型对指定数据进行转换
        #     fit_transform(X[,y]):对数据拟合相应的方法，并且进行转换
        # 建模分析class：Classification、Regression、Clustering
        #  predict(X):对数据进行预测，返回预测值,使用拟合好的模型对数据计算预测值
        #  predict_proba(X):对数据进行预测，返回预测概率，模型给出的每个案例（各个类别）的预测概率
        #  score(X, y, sample_weight=None):返回模型在数据上的拟合优度，越大越好，返回模型决定系数/模型准确度评价指标
        # Modelclass中基本通用的类属性：(模型拟合前该属性不存在)
        #  coef_:模型参数，对于回归模型，coef_为模型参数，对于分类模型，coef_为每个类别的参数，array，如果有多个因变量时，coef_为多个参数的数组，多维数组
        #  intercept_:模型常数项，对于回归模型，intercept_为常数项，对于分类模型，intercept_为每个类别的常数项
        #  n_iter_:迭代次数，对于迭代模型，n_iter_为迭代次数，对于非迭代模型，n_iter_为None
        #  classes_:类别名称，对于分类模型，classes_为类别名称，对于回归模型，classes_为None
        #  n_classes_:类别数，对于分类模型，n_classes_为类别数，对于回归模型，n_classes_为None
        #  n_features_:输入特征数，对于回归模型，n_features_为输入特征数，对于分类模型，n_features_为None
        #  n_outputs_:输出特征数，对于回归模型，n_outputs_为输出特征数，对于分类模型，n_outputs_为None
        #  loss_:损失函数，对于回归模型，loss_为损失函数，对于分类模型，loss_为None
        #
        # 保存为外部文件(模型的持久化)，python中也由pickle模块，但是最好使用sklearn中的joblib模块
        # from sklearn.externals import joblib
        # joblib.dump(clf, 'model.pkl')
        #
        # clf1=joblib.load('model.pkl')
        # print(clf1)此为读入外部保存的模型文件，可以直接使用，不需要再训练



#结巴分词使用
#import jieba
#tmpstr = "郭靖和哀牢山三十六剑。"
#res = jieba.cut(tmpstr)#默认精确模式
#print(res)#，打印的是生成器对象的信息，
#此为一个可迭代的generator，可以使用for循环来遍历结果，本质上类似list
#print(" ".join(res))
#print(list(word for word in res))#以列表的形式表达generator的用法
#print(jieba.lcut(tmpstr))#结果直接输出为list列表形式# Print all words in the list res
#print('/'.join(jieba.cut(tmpstr,cut_all=True)))#全模式，把可能的数字结果全部输出
#搜索引擎模式，还有jieba.lcut_for_search可用#提高搜索引擎的命中率
#print('/'.join(jieba.cut_for_search(tmpstr)))


import numpy as np
#一般为黑（0），白（255）
arr = np.array([      [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0.3, 1, 1, 1, 1, 1, 1, 0.7, 0., 0., 0., 0.],
                      [0., 0., 0., 0.3, 1, 0.7, 0.8, 0.7, 0.8, 1, 0.5, 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1, 0.3, 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1, 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0., 1, 0.7, 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0., 1, 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0.5, 1, 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 1, 0.5, 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 1, 0., 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0.5, 1, 0., 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 1, 0.5, 0., 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0.5, 0., 0., 0., 0., 0., 0., 0.],
                      [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])


# #print(np.uint8(255-arr * 255))
from PIL import Image
# #用Image.fromarray将矩阵转换为图像，
pico = Image.fromarray(np.uint8(arr * 255))#可使用mode参数做进一步的类型设定
# # print(pico)打印图像的信息
# # pico.show()显示图像
from matplotlib import pyplot as plt
# #用matplotlib来呈现图像
# fig,ax = plt.subplots()
# ax.imshow(arr,cmap='Blues')#camp为颜色参数
# #plt.show()


# #图片保存，可调用save直接保存
# pico.save('pic.png')#写入的数据和原始数据不同,会转换为灰度图
# #使用matplotlib中的图片保存命令，会自动转换为彩色图片类型
# plt.imsave('pic2.png',arr)
# #使用matplotlib中的图片读取与转换命令
# img = plt.imread('pic.png')#读入即自动转换为ndarray，jpg读取为有损读取
# print(img.shape)#输出图像的尺寸
# print(img)
# plt.imshow(img,cmap='Greens')
# plt.colorbar()  # 显示颜色条，用于解释灰度值
# plt.show()


#使用matplotlib接口写入的图片已经转化为RGB格式
# img = plt.imread('pic2.png')
# print(img.shape)
# print(img[:,:,0])#读取的三个分别分长宽，第三个为RGB格式（4），有红绿蓝三个通道，再加一个透明度

#img对象与数据矩阵的转换
print(type(pico))
#读取图片及其长宽设定
#pico = Image.open('pic.png')
pixel = pico.load()
width,height = pico.size
print(pixel,width,height)

#将像素值依次读取为一个list
imageData = list()
for x in range(0,width):
    for y in range(0,height):
        imageData.append(pixel[y,x])

imageData = np.array(imageData,dtype='float')
print(imageData.shape)
print(imageData)

#将list转换回矩阵格式
print(imageData.reshape(height,width))
# 用Image.fromarray将矩阵转换为图像
print(Image.fromarray(imageData.reshape(height,width)))


#决策树：易于理解和解释，可以处理多种数据类型和大规模数据集；缺点是容易过拟合，对噪声和缺失数据敏感，无法处理连续值输出
# 朴素贝叶斯算法：算法逻辑简单，分类过程中时空开销小，可以处理多类别问题；缺点是对输入数据准备方式敏感，对属性之间的相关性要求较高
#支持向量机（SVM）：有严格的数学理论支持，算法的的鲁棒性很好；缺点：训练所需要的资源很大，只能处理二分类问题，模型预测与支撑向量的个数成正比
#核函数：线性核函数、多项式核函数、高斯核函数
#人工神经网络的模型构建：可以像搭积木一样不断地扩展模型的边界，而对于内部具体的运行不需要加以太多的干涉；缺点是神经网络缺乏可解释性，内部纷繁复杂，神经网络非常消耗资源
#预先设定一种网络结构和激活函数，初始化模型中的权重，根据输入数据和权重来预测结果，模型要调节权重
#激活函数有：ReLU、sigmoid、tanh等

#k-means聚类算法：先随机在空间中选取三个点，称为中心点，计算所有点到这三个点的距离，用的是欧氏距离，使用每组数据计算出一个均值，作为下一轮迭代的中心点
#算法优缺点：简洁明了，计算复杂度低，收敛速度快；缺点：结果不稳定，无法解决样本不均衡的问题，容易收敛到局部最优解，受噪声影响大
#DB-Scan算法：不需要划分个数，可以处理噪声点，可以处理任意形状的空间聚类问题；缺点：需要指定最小样本量和半径两个参数，数据量大时开销也很大，如果样本集的密度不均匀、聚类间距相差很大时，聚类质量较差













































